﻿using System;

namespace Csharp关于类的练习
{
    #region 定义一个Ticket类
    //·写一个Ticket类，有一个距离变量(本属性只读，在构造方法中赋值）

    //不能为负数，有一个价格属性，有一个方法GetPrice可以读取到价格

    //并且根据距离distance计算价格price(1元/公里)。
    /*
        0-100公里      不打折
        101-200公里    打9.5折
        201-300公里    打9折
        300公里以上     打8折
        有一个方法，可以显示这张票的信息。100公里100块钱
     */
    //class Ticket//距离变量
    //{
    //    int distance;//都不公开，可以通过方法获取到
    //    float price;

    //    //构造方法
    //    public Ticket(int distance) 
    //    {
    //        if (distance <= 0)
    //        {
    //            distance = 0;
    //        }
    //        this.distance = distance;
    //        GetPrice();//调用价格函数
    //    }

    //public int GetDistance() 
    //{
    //return distance;//只能读，不能修改
    //}//这样外部能访问到distance，但是不能修改，拿的只是值，不是我们的地址

    //public float GetPrice()
    //{
    //    if (distance <= 100)
    //    {
    //        price = distance;
    //    }
    //    else if (distance >= 101 && distance <= 200)
    //    {
    //        price = distance * 0.95f;
    //    }
    //    else if (distance >= 201 && distance <= 300)
    //    {
    //        price = distance * 0.9f;
    //    }
    //    else
    //    {
    //        price = distance * 0.8f;
    //    }
    //    return price;
    //}


    //        public void ShowTicket()
    //        {
    //            Console.WriteLine("这张票的距离为{0}公里，价格为{1}元",distance,price);
    //        }
    //    }
    #endregion

    #region 定义一个人类
    /*
     定义一个人类,有姓名，身高,年龄，对象,是否有驾照等属性,
     有说话，走路等方法。
     用人类声明若干个对象

     定义一个载具类，速度，最大速度，可乘人数
     司机及乘客等有上车，下车，行驶，车祸等方法---->通过上下车的方法安装乘客
     
     用载具类声明一个对象，并将声明的人装载上车
     */
    class people //定义好一个模板记得实例化，写一个构造函数
    {
        public string name;
        public float highth;
        public int age;
        public people Lover;

        public bool isDriver;

        //构造函数
        public people(string name,float highth,int age,bool isDriver) 
        {
            this.name = name;
            this.highth = highth;
            this.age = age;
            this.isDriver = isDriver;
            
        }


        public people(string name) //重载一个函数
        {
            this.name = name;
        }

        public void say() //说话方法
        {
            if (isDriver) 
            {
                Console.WriteLine("我是{0}，我身高{1}米，今年{2}岁了，我的对象是{3},我有驾照", name, highth,age, Lover.name);
            }
            else Console.WriteLine("我是{0}，我身高{1}米，今年{2}岁了，我的对象是{3}，我没有驾照", name, highth, age,Lover.name);
        }

        public void walk() //走路方法
        {
            Console.WriteLine("{0}在走路",name);
        }

    }


    class car 
    {
        public float speed;
        public float maxspeed;
        public int chengkenum;
        public people driver;
        public people[] passengers;//乘客是数组


        //函数写在类里面
        public car(float speed, float maxspeed, int chengkenum, people driver) 
        {
            this.speed = speed;
            this.maxspeed = maxspeed;
            this.chengkenum = chengkenum;
            this.driver = driver;

            passengers = new people[chengkenum];
        }

        #region 上车方法
        public void GetOn(people p) 
        {
            //找到一个空位让p上----》遍历乘客这个数组
            for (int i = 0; i < passengers.Length; i++)
            {
                if (passengers[i]==null)//引用类型空是null----找到空位置
                {
                    passengers[i] = p;//去空位置坐着
                    Console.WriteLine("{0}上车了",p.name);
                    return;
                }
            }
            Console.WriteLine("车上没位置给{0}坐了",p.name);
        }
        #endregion

        #region 下车方法
        public void GetOff(people p)
        {
            //在车上找是否有这个乘客----》遍历乘客这个数组
            for (int i = 0; i < passengers.Length; i++)
            {
                if (p==passengers[i])//找到这个乘客
                {
                    passengers[i] = null;//直接为空
                    Console.WriteLine("{0}下车了", p.name);
                    return;
                }
            }
            Console.WriteLine("车上查无此人 404 NOT FOUND");
        }
        #endregion

        #region 行驶方法

        public void Drive()
        {
            //首先判断这个司机有没有驾照
            if (driver.isDriver == true)
            {
                this.speed++;
                Console.WriteLine("现在车速是多少{0},司机是{1}，大家都很嗨~",speed,driver.name);
                if (this.speed > maxspeed)
                {
                    //车祸
                    caraccident();
                }

            }
            else //司机没驾照
            {
                //车祸
                Console.WriteLine("司机是{0}，没有驾照",driver.name);
                caraccident();
            }
        }

        #endregion

        #region 车祸方法
        void caraccident() //------>自己用所以不用公开
        {
            Console.WriteLine("发生车祸了!!!!!!!!!!");
            for (int i = 0; i < passengers.Length; i++)
            {
                if (passengers[i]!=null)
                {
                    //车祸全部死亡
                    Console.WriteLine(passengers[i].name + "死亡");
                }
            }
            Console.WriteLine(driver.name+"死得最惨！");
        }


        #endregion
    }

    //构造函数




    #endregion
    class Program
    {
        static void Main(string[] args)
        {
            #region 汽车票
            //Ticket qichepiao = new Ticket(100);
            //qichepiao.ShowTicket();
            #endregion

            #region 创建人
            people laowang = new people("老王",1.83f,23,true);
            people xiaohong = new people("小红", 1.63f, 20, false);


            people xiaoming = new people("小明");
            people xiaohua = new people("小花");
            people xiaogang = new people("小刚");
            people xiaomei = new people("小美");

            //laowang.Lover = xiaohong;
            //laowang.say();
            #endregion

            #region 创建载具
            car a = new car(60,200,3,laowang);
            a.GetOn(xiaohong);//小红上车
            a.GetOn(xiaoming);
            a.GetOn(xiaohua);
            a.GetOn(xiaomei);


            a.GetOff(xiaohong);
            a.GetOn(xiaomei);

            a.driver = xiaoming;
            //xiaoming.isDriver = false;
            while (true)
            {
                Console.ReadKey();
                a.Drive();
            }
            #endregion

        }
    }
}
